#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10,M=2e5+10;
int e[M],ne[M],idx,h[N];
int f[N];
int st[N];

queue<int> q;
vector<int> v[N];
void add(int a,int b)
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void dfs_fa(int u,int fa)
{
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(j==fa) continue;
		f[j]=u;
		dfs_fa(j,u);
	}
}
void dfs(int u,int cnt)
{
	if(st[u] || u==1)
	{
		return ;
	}
	st[u]=cnt;
	q.push(u);
	dfs(f[u],cnt);
}
int main()
{
	memset(h,-1,sizeof(f));
	IOS;
	int n,m;
	cin>>n>>m;
	for(int i=2;i<=n;i++)
	{
		int u;
		cin>>u;
		add(u,i);
		add(i,u);
	}
	dfs_fa(1,-1);
	for(int i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	
	q.push(1);
	st[1]=0;
	while(q.size())
	{
		int t=q.front();
		q.pop();
		for(auto u:v[t])
		{
			dfs(u,st[t]+1);
		}
	}
	cout<<st[1]<<endl;
	for(int i=2;i<=n;i++)
	{
		if(st[i]) cout<<st[i]<<' ';
		else cout<<-1<<' ';
	}
	return 0;
}
